import vnode from './vnode.js'
// 编写一个低配版本h函数，必须接收三个参数
// 相当于重载功能较弱
// 调用的形态必须是下面的三种之一
// h('div', {}, '文字')
// h('div', {}, h())
// h('div', {}, [])
export default function (sel, data, c) {
	// 检查参数的个数 arguments是所有参数
	if (arguments.length !== 3) {
		throw new Error('对不起，h函数必须传入3个参数，我们是低配版h函数')
	}
	// 检查参数c的类型
	if (typeof c === 'string' || typeof c === 'number') {
		// 说明现在调用h函数是形态一
		return vnode(sel, data, undefined, c, undefined)
	} else if (Array.isArray(c)) {
		// 收集children
		// 说明现在调用h函数是形态三
		for (let i = 0;i < c.length;i++) {
			//  检查c[i]必须是一个对象，如果不满足则报错
			if (typeof c[i] === 'object' && c.hasOwnProperty('sel')) {
				throw new Error('传入的数组参数中有项的结果不是h函数')
			}
		}
		// 循环结束了，就说明children收集完毕了，直接返回
		return vnode(sel, data, c, undefined, undefined)
		// hasOwnProperty 检查对象c中是否有sel属性
	} else if (typeof c === 'object' && c.hasOwnProperty('sel')) {
		// 说明现在调用h函数是形态二
		// 即，传入的c是唯一的children。不用执行c，因为测试语句中已经执行了c
		let children = [c]
		return vnode(sel, data, children, undefined, undefined)
	} else {
		throw new Error('传入的第三个参数类型不对')
	}
}